<script>
/* const a = 8
console.log(typeof a) // 'number'
console.log(typeof typeof typeof typeof a) // 'string' */


/* function a() {}
console.log(typeof a) // 'function'
// 缺点：不能区分复杂数据类型（不包括函数）
console.log(typeof {})
console.log(typeof [])
console.log(typeof null) */

// instanceof: 左边的能不能通过原型链找到右边的.prototype
// 不能准确区分，例如，如下。
/* console.log([] instanceof Object) // true
// console.log([].__proto__.__proto__ === Object.prototype)
console.log({} instanceof Object) // true

console.log({} instanceof Array) // 万一是 false，只能说明不是数组，不是数组是啥呢？ */

// constructor 往往用来判断实例和构造函数之间的关系
/* function Person() {}
const p = new Person()
console.log(p.constructor === Person); */



// 调用 Object.prototype.toString 方法的同时并把内部的 this 指向，指向了第一个参数
console.log(Object.prototype.toString.call([]))
console.log({}.toString.call({}))
console.log({}.__proto__.toString.call(null))
console.log(Object.prototype.toString.call(undefined))
console.log(Object.prototype.toString.call(/d/))
console.log([].__proto__.__proto__.toString.call(null))
</script>